package cn.ichiva.puppet.example.todo;

import cn.ichiva.puppet.example.base.p2.Todo;
import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

public class FXTodoManager extends VBox {
    StringProperty inTodo = new SimpleStringProperty();
    List<Todo> list = new ArrayList<>(Arrays.asList(
            new Todo("盘古MES二开"),
            new Todo("用友NC会议"),
            new Todo("泛微OA技术支持")
    ));

    ObservableList<Node> todoNodes;

    public FXTodoManager(){
        getChildren().add(new HBox(){
            {
                getChildren().addAll(
                        new TextField(){
                            {
                                textProperty().bindBidirectional(inTodo);
                                setOnKeyPressed(FXTodoManager.this::insertTodo);
                            }
                        },
                        new Button("#${添加}"){
                            {
                                setOnAction(FXTodoManager.this::addTodo);
                            }
                        }
                );
            }
        });

        getChildren().add(new VBox(){
            {
                todoNodes = getChildren();
                todoNodes.setAll(createTodoList(list));
            }
        });
    }

    private List<Node> createTodoList(List<Todo> list){
        return list.stream().map(FXTodoManager.this::creatTodoNode).collect(Collectors.toList());
    }

    private HBox creatTodoNode(Todo todo) {
        return new HBox(){
            {
                getChildren().addAll(
                    new TextField(){
                        {
                            setText(todo.getText());
                        }
                    },
                    new Button("x"){
                        {
                            setOnAction(actionEvent -> removeTodo(todo));
                        }
                    }
                );
            }
        };
    }

    @FXML
    void removeTodo(Todo todo){
        list.remove(todo);
        update();
    }

    void insertTodo(KeyEvent event){
        if (event.getCode() == KeyCode.ENTER) {
            addTodo(event);
        }
    }

    void addTodo(Event event){
        String text = inTodo.get();
        if(text != null && text.length() != 0){
            Todo todo = new Todo();
            todo.setText(text);
            todo.setCreateTime(new Date());

            addTodo(todo);
            inTodo.set("");
        }
    }

    void addTodo(Todo todo){
        list.add(todo);
        update();
    }

    void update(){
        Platform.runLater(() -> {
            todoNodes.clear();
            todoNodes.addAll(createTodoList(list));
        });
    }

}
